/**
 * 格式化时间显示
 * 将ISO时间字符串或Date对象格式化为用户友好的格式
 *
 * @param time - 时间值，可以是ISO字符串、Date对象或null/undefined
 * @param format - 格式化类型，默认为 'datetime'
 * @returns 格式化后的时间字符串，如果时间无效则返回 '-'
 *
 * @example
 * ```
 * // ISO字符串格式化
 * formatTime('2025-07-24T08:54:46.000Z') // '2025-07-24 16:54:46'
 *
 * // Date对象格式化
 * formatTime(new Date()) // '2025-07-24 16:54:46'
 *
 * // 仅日期
 * formatTime('2025-07-24T08:54:46.000Z', 'date') // '2025-07-24'
 *
 * // 无效时间
 * formatTime(null) // '-'
 * ```
 */
export function formatTime(
  time: string | Date | null | undefined,
  format: 'datetime' | 'date' | 'time' | 'datetime-minute' = 'datetime'
): string {
  if (!time) {
    return '-'
  }

  try {
    let date: Date

    if (typeof time === 'string') {
      // 如果是ISO字符串，先解析为Date对象
      date = new Date(time)
    } else if (time instanceof Date) {
      date = time
    } else {
      return '-'
    }

    // 检查日期是否有效
    if (isNaN(date.getTime())) {
      return '-'
    }

    // 格式化日期时间
    const year = date.getFullYear()
    const month = String(date.getMonth() + 1).padStart(2, '0')
    const day = String(date.getDate()).padStart(2, '0')
    const hours = String(date.getHours()).padStart(2, '0')
    const minutes = String(date.getMinutes()).padStart(2, '0')
    const seconds = String(date.getSeconds()).padStart(2, '0')

    switch (format) {
      case 'date':
        return `${year}-${month}-${day}`
      case 'time':
        return `${hours}:${minutes}:${seconds}`
      case 'datetime-minute':
        return `${year}-${month}-${day} ${hours}:${minutes}`
      case 'datetime':
      default:
        return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
    }
  } catch (error) {
    console.warn('时间格式化失败:', error)
    return '-'
  }
}

/**
 * 格式化日期显示（不包含时间）
 *
 * @param time - 时间值
 * @returns 格式化后的日期字符串
 *
 * @example
 * ```
 * formatDate('2025-07-24T08:54:46.000Z') // '2025-07-24'
 * ```
 */
export function formatDate(time: string | Date | null | undefined): string {
  return formatTime(time, 'date')
}

/**
 * 格式化时间显示（不包含日期）
 *
 * @param time - 时间值
 * @returns 格式化后的时间字符串
 *
 * @example
 * ```
 * formatTimeOnly('2025-07-24T08:54:46.000Z') // '16:54:46'
 * ```
 */
export function formatTimeOnly(time: string | Date | null | undefined): string {
  return formatTime(time, 'time')
}

/**
 * 格式化日期时间显示（精确到分钟）
 *
 * @param time - 时间值
 * @returns 格式化后的日期时间字符串
 *
 * @example
 * ```
 * formatDateTime('2025-07-24T08:54:46.000Z') // '2025-07-24 16:54'
 * ```
 */
export function formatDateTime(time: string | Date | null | undefined): string {
  return formatTime(time, 'datetime-minute')
}

/**
 * 检查时间字符串是否为ISO格式
 * 
 * @param timeStr - 时间字符串
 * @returns 是否为ISO格式
 */
export function isISOTimeString(timeStr: string): boolean {
  if (!timeStr) return false
  
  // ISO 8601 格式通常包含 'T' 和 'Z' 或时区信息
  return /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?([+-]\d{2}:\d{2})?$/.test(timeStr)
}

/**
 * 获取相对时间描述
 *
 * @param time - 时间值
 * @returns 相对时间描述
 *
 * @example
 * ```
 * getRelativeTime(new Date(Date.now() - 1000 * 60 * 5)) // '5分钟前'
 * ```
 */
export function getRelativeTime(time: string | Date | null | undefined): string {
  if (!time) return '-'

  try {
    let date: Date

    if (typeof time === 'string') {
      date = new Date(time)
    } else if (time instanceof Date) {
      date = time
    } else {
      return '-'
    }

    if (isNaN(date.getTime())) {
      return '-'
    }

    const now = new Date()
    const diffMs = now.getTime() - date.getTime()
    const diffMinutes = Math.floor(diffMs / (1000 * 60))
    const diffHours = Math.floor(diffMs / (1000 * 60 * 60))
    const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))

    if (diffMinutes < 1) {
      return '刚刚'
    } else if (diffMinutes < 60) {
      return `${diffMinutes}分钟前`
    } else if (diffHours < 24) {
      return `${diffHours}小时前`
    } else if (diffDays < 7) {
      return `${diffDays}天前`
    } else {
      return formatDate(date)
    }
  } catch (error) {
    console.warn('相对时间计算失败:', error)
    return '-'
  }
}
